package com.service.user.impl;

import com.dao.UserDao;
import com.entity.User;
import com.service.user.UserService;
import com.utils.FileUploadUtil;
import com.utils.SqlSessionGetter;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;
import java.util.UUID;

/**
 * 提供用户信息的修改、添加等功能
 *
 * 
 */
@Service
public class UserServiceImpl implements UserService {

  /**
   * 获取个人信息
   *
   * @param userId 用户编号
   * @return 用户信息
   */
  @Override
  public User getPersonalInfo(String userId) {
    SqlSession session = SqlSessionGetter.getSqlSession();
    UserDao dao = session.getMapper(UserDao.class);
    User user = dao.selectAUser(userId);
    session.close();
    return user;
  }

  /**
   * 修改用户昵称
   *
   * @param userId 用户编号
   * @param nickname 新的昵称
   * @return 修改成功返回1，失败返回0
   */
  @Override
  public int chNickname(String userId, String nickname) {
    SqlSession session = SqlSessionGetter.getSqlSession();
    UserDao dao = session.getMapper(UserDao.class);
    int row = dao.updateNickname(userId, nickname);
    session.commit();
    session.close();
    return row;
  }

  /**
   * 更换头像，保存头像并更新url
   *
   * @param userId 用户编号
   * @param file 头像文件
   * @return 若用户存在且文件是.jpg/png/gif/jpeg格式的图片，且更换成功，返回新的图片url,否则返回null
   */
  @Override
  public String chImage(String userId, MultipartFile file) {
    // 保存新的图片
    String newImageURL =
        FileUploadUtil.uploadFile(
            file,
            UUID.randomUUID().toString().replace("-", ""),
            FileUploadUtil.USERS_IMAGES_SUBDIR,
            FileUploadUtil.IMAGE_SUFFIX);
    if (newImageURL == null) {
      // 文件格式错误
      return null;
    }

    SqlSession session = SqlSessionGetter.getSqlSession();
    UserDao dao = session.getMapper(UserDao.class);
    // 取得原来图片的地址
    String oldImageURL = dao.selectImageURL(userId);
    // 将原来的图片删除
    FileUploadUtil.delFile(oldImageURL);

    // 保存新的url
    dao.updateImageURL(userId, newImageURL);
    session.commit();
    session.close();
    return newImageURL;
  }

  @Override
  public Map<String, String> getUserLink(String userId) {
    SqlSession session = SqlSessionGetter.getSqlSession();
    UserDao dao = session.getMapper(UserDao.class);
    Map<String, String> link = dao.selectUserLink(userId);
    session.close();
    return link;
  }

  /**
   * 修改基本信息
   *
   * @param userId 用户编号
   * @param realName 真实姓名
   * @param sex 性别
   * @param email 邮箱
   * @param birthday 生日
   * @param age 年龄
   * @param location 位置
   * @param elucidation 个人说明
   * @return 修改成功返回1，否则返回0
   */
  @Override
  public int chBasicInfo(
      String userId,
      String realName,
      char sex,
      String email,
      String birthday,
      int age,
      String location,
      String elucidation) {
    SqlSession session = SqlSessionGetter.getSqlSession();
    UserDao dao = session.getMapper(UserDao.class);
    int row =
        dao.updateBasicInfo(userId, realName, sex, email, birthday, age, location, elucidation);
    session.commit();
    session.close();
    return row;
  }

  /**
   * 修改教育信息
   *
   * @param userId 用户编号
   * @param school 学校
   * @param major 专业
   * @param enrollYear 入学年份
   * @param eduBackGround 学历
   * @return 修改成功返回1，否则返回0
   */
  @Override
  public int chEduInfo(
      String userId, String school, String major, int enrollYear, String eduBackGround) {
    SqlSession session = SqlSessionGetter.getSqlSession();
    UserDao dao = session.getMapper(UserDao.class);
    int row = dao.updateEduInfo(userId, school, major, enrollYear, eduBackGround);
    session.commit();
    session.close();
    return row;
  }

  /**
   * 修改标签
   *
   * @param userId 用户编号
   * @param label1Id 标签1编号
   * @param label2Id 标签2编号
   * @param label3Id 标签3编号
   * @return 修改成功返回1，否则返回0
   */
  @Override
  public int chLabel(String userId, int label1Id, int label2Id, int label3Id) {
    SqlSession session = SqlSessionGetter.getSqlSession();
    UserDao dao = session.getMapper(UserDao.class);
    int row = dao.updateLabel(userId, label1Id, label2Id, label3Id);
    session.commit();
    session.close();
    return row;
  }
}
